package com.primary.array;

/**
 * @author: yyh
 * @description:删除排序数组中的重复项,https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2gy9m/
 * @date: 2022/7/14 15:30
 */
public class RemoveDuplicates {
    /**
     * 示例 1：
     * <p>
     * 输入：nums = [1,1,2]
     * 输出：2, nums = [1,2,_]
     * 解释：函数应该返回新的长度 2 ，并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
     * 示例 2：
     * <p>
     * 输入：nums = [0,0,1,1,1,2,2,3,3,4]
     * 输出：5, nums = [0,1,2,3,4]
     * 解释：函数应该返回新的长度 5 ， 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
     * <p>
     * 提示：
     * <p>
     * 1 <= nums.length <= 3 * 104
     * -104 <= nums[i] <= 104
     * nums 已按 升序 排列
     */

    public static int removeDuplicates(int[] nums) {
        if (nums.length == 1) {
            return 1;
        }
        int size = 1;
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] == nums[i + 1]) {
                move(nums, i + 1, size);
            } else {
                size++;
            }
        }
        return size;
    }

    private static void move(int[] a, int index, int len) {
        for (int i = index; i < a.length; i++) {
            a[i - 1] = a[i];
        }
    }

    public static void main(String[] args) {
//        int[] a = new int[]{1, 1, 2};
        int[] a = new int[]{1, 1, 2, 3, 3, 4, 5, 5, 5, 5, 6};
//        removeDuplicates_1(a);
        removeDuplicates_2(a);

        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

    //双指针解决
    public static int removeDuplicates_1(int[] A) {
        //边界条件判断
        if (A.length == 1)
            return 1;
        int left = 0;
        for (int right = 1; right < A.length; right++)
            //如果左指针和右指针指向的值一样，说明有重复的，
            //这个时候，左指针不动，右指针继续往右移。如果他俩
            //指向的值不一样就把右指针指向的值往前挪
            if (A[left] != A[right])
                A[++left] = A[right];
        return ++left;
    }

    public static int removeDuplicates_2(int[] nums) {
        if (nums.length == 1) {
            return 1;
        }
        int index = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[index] != nums[i] && ++index != i) {
                nums[index] = nums[i];
            }
        }
        return ++index;
    }
}
